10 REM *** (FFT6.01) FFT/INV FFT ***

11 REM DIFFERENTIATES & INTEGRATES A STEP FUNCTION

12 SCREEN 9, 1: COLOR 15, 1

13 CLS : PRINT : PRINT "INPUT NUMBER OF DATA POINTS AS 2^N"

'DEFDBL A-Z

14 INPUT "N = "; N

16 Q = 2 ^ N

20 Q2 = Q / 2: Q3 = Q2 - 1: Q4 = Q / 4: Q5 = Q4 - 1: Q8 = Q / 8

21 FMN = 0: FMX = Q: FSTEP = 1

22 DIM Y(Q), C(2, Q), S(2, Q), KC(Q), KS(Q), F(2, (FTOP - FBOT) + 1)

23 DIM COMP(3, KB, KB), Z(2, KB, KB + 1)

24 X0 = 50: Y0 = 200: XSF = 500 / Q: YSF = 1024

26 IOFLG = 1

30 PI = 3.141592653589793#: P2 = 2 * PI: K1 = P2 / Q: PI2 = P2

32 FOR I = 0 TO Q: KC(I) = COS(K1 * I): KS(I) = SIN(K1 * I): NEXT

40 CLS

50 PRINT SPC(30); "MAIN MENU": PRINT : PRINT

52 PRINT SPC(5); "1 = GENERATE STEP FUNCTION & TRANSFORM": PRINT

54 PRINT SPC(5); "2 = FORWARD TRANSFORM": PRINT

56 PRINT SPC(5); "3 = MODIFY SPECTRUM": PRINT

58 PRINT SPC(5); "4 = INVERSE TRANSFORM": PRINT

60 PRINT SPC(5); "5 = MODIFY SYSTEM": PRINT

62 PRINT SPC(5); "6 = EXIT": PRINT

70 PRINT SPC(10); "MAKE SELECTION :";

80 A$ = INKEY$: IF A$ = "" THEN 80

90 A = VAL(A$): ON A GOSUB 600, 100, 1000, 120, 140, 990

95 GOTO 40



100 REM *** FORWARD FFT ***

102 K6 = -1: SK1 = 2

104 CLS : HDR$ = "FREQ   F(COS)       F(SIN)       "

106 HDR$ = HDR$ + "FREQ   F(COS)       F(SIN)": PRINT : PRINT

108 GOSUB 180

110 RETURN



120 REM *** INVERSE TRANSFORM ***

122 SK1 = 1: K6 = 1: YSF = 64

124 CLS : HDR$ = "TIME    AMPLITUDE   NOT USED     "

126 HDR$ = HDR$ + "TIME   AMPLITUDE     NOT USED": PRINT : PRINT

128 GOSUB 180

130 RETURN



140 ' ***   MODIFY SYSTEM PARAMETERS   ***

142 CLS

144 INPUT "PRESENT DATA GRAPHICALLY? (Y/N):"; A$

146 IF A$ = "Y" OR A$ = "y" THEN IOFLG = 1 ELSE IOFLG = -1

148 RETURN



180 REM *** FFT ROUTINE ***

181 T9 = TIMER

182 FOR M = 0 TO N - 1: QT = 2 ^ M: KT1 = 2 ^ (N - M - 1)

183 REM *** UNIVERSAL BUTTERFLY ***

184 FOR J = 0 TO Q3 STEP QT: J1 = 2 * J: K9 = J + Q2

185 FOR I = 0 TO QT - 1: KT = I * KT1: K = K9 + I

186 C(T0, J1 + I) = (C(T1, I + J) + C(T1, K) * KC(KT) - K6 * S(T1, K) * KS(KT)) / SK1

187 S(T0, J1 + I) = (S(T1, I + J) + K6 * C(T1, K) * KS(KT) + S(T1, K) * KC(KT)) / SK1

188 NEXT I

190 J1 = J1 + QT

192 FOR I = 0 TO QT - 1: KT = (I + QT) * KT1: K = K9 + I

194 C(T0, J1 + I) = (C(T1, I + J) + C(T1, K) * KC(KT) - K6 * S(T1, K) * KS(KT)) / SK1

195 S(T0, J1 + I) = (S(T1, I + J) + K6 * C(T1, K) * KS(KT) + S(T1, K) * KC(KT)) / SK1

196 NEXT I: NEXT J

197 IF T0 = 0 THEN T0 = 1: T1 = 0: GOTO 199

198 T0 = 0: T1 = 1

199 NEXT M



200 T9 = TIMER - T9

202 IF IOFLG = 1 THEN 250

206 ZSTP = 15

208 PRINT HDR$: PRINT : PRINT

210 FOR Z = 0 TO Q2 - 1

215 GOSUB 300

216 IF Z > ZSTP THEN 350 ' PRINT 1 SCREEN AT A TIME

220 NEXT Z

222 LOCATE 1, 1: PRINT : PRINT "TIME ="; T9

225 INPUT "C/R TO CONTINUE:"; A$

229 RETURN



250 REM *** PLOT OUTPUT ***

252 CLS : YPX = 0: IF K6 = -1 THEN 280

254 Y0 = 175

256 FOR I = 0 TO Q - 1

258 IF C(T1, I) > YPX THEN YPX = C(T1, I)

260 NEXT I

262 YSF = 100 / YPX

263 LINE (X0 + 10, Y0 - 100)-(X0, Y0 - 100)

264 LOCATE 6, 1: PRINT USING "###.##"; YPX

265 LINE (X0 - 1, 50)-(X0 - 1, 300)

266 LINE (X0, Y0)-(X0 + 500, Y0)

268 LINE (X0, Y0)-(X0, Y0)



270 FOR I = 0 TO Q - 1

272 YP = C(T1, I)

274 IF K6 = -1 THEN YP = SQR(C(T1, I) ^ 2 + S(T1, I) ^ 2)

276 LINE -(X0 + XSF * I, Y0 - YSF * YP)

278 NEXT I

279 GOTO 222

280 ' ***   FIND Y SCALE FACTOR FOR FREQ DOMAIN PLOT   ***

281 Y0 = 300 ' SET Y AXIS ORIGIN

282 FOR I = 0 TO Q - 1 ' FIND LARGEST VALUE IN ARRAY

284 YP = SQR(C(T1, I) ^ 2 + S(T1, I) ^ 2): IF YP > YPX THEN YPX = YP

286 NEXT I

287 YSF = 200 / YPX ' SET SCALE FACTOR

288 LINE (X0 + 10, Y0 - 200)-(X0, Y0 - 200)

289 LOCATE 8, 1: PRINT USING "###.##"; YPX: GOTO 265



300 PRINT USING "###"; Z; : PRINT "   ";

310 PRINT USING "+##.#####"; C(T1, Z); : PRINT "    ";

312 PRINT USING "+##.#####"; S(T1, Z); : PRINT "      ";

320 PRINT USING "###"; Z + Q2; : PRINT "   ";

322 PRINT USING "+##.#####"; C(T1, Z + Q2); : PRINT "    ";

324 PRINT USING "+##.#####"; S(T1, Z + Q2)

330 RETURN



350 REM *** STOP WHEN SCREEN FULL ***

352 ZSTP = ZSTP + 16

354 PRINT : INPUT "C/R TO CONTINUE:"; A$

356 CLS : PRINT HDR$: PRINT : PRINT

358 GOTO 220



600 REM * SQUARE FUNCTION *

602 CLS : PRINT : PRINT

604 PRINT "PREPARING DATA INPUT - PLEASE WAIT!"

610 FOR I = 0 TO Q - 1: C(0, I) = 0: S(0, I) = 0

612 FOR J = 1 TO Q2 - 1 STEP 2

620 C(0, I) = C(0, I) + (SIN(K1 * I * J) / (J * 1))

630 NEXT J

640 C(0, I) = C(0, I) * 4 / PI ' CORRECT FOR UNIT SQUARE

650 NEXT I

652 HDR$ = "TIME    AMPLITUDE   NOT USED     "

654 HDR$ = HDR$ + "TIME   AMPLITUDE     NOT USED": PRINT : PRINT

660 K6 = 1:

662 GOSUB 202

670 T0 = 1: T1 = 0

680 GOSUB 100

690 RETURN



990 END



1000 REM *** DO CALCULUS ***

1010 CLS

1050 PRINT SPC(30); "CALCULUS MENU": PRINT : PRINT

1060 PRINT SPC(5); "1 = DIFFERENTIATE FUNCTION": PRINT

1062 PRINT SPC(5); "2 = INTEGRATE FUNCTION": PRINT

1066 PRINT SPC(5); "9 = EXIT": PRINT

1070 PRINT SPC(10); "MAKE SELECTION :";

1080 A$ = INKEY$: IF A$ = "" THEN 1080

1090 A = VAL(A$): ON A GOSUB 1100, 1200

1099 RETURN



1100 REM *** DIFFERENTIATE FUNCTION ***

1110 FOR I = 0 TO Q3: KDF = I * P2 ' I = HARMONIC, PI = 3.1416...

1120 CTemp = -KDF * S(T1, I): S(T1, I) = KDF * C(T1, I): C(T1, I) = CTemp

1130 CTemp = KDF * S(T1, Q - I): S(T1, Q - I) = -KDF * C(T1, Q - I): C(T1, Q - I) = CTemp

1140 NEXT I

1150 RETURN



1200 REM *** INTEGRATE FUNCTION ***

1210 FOR I = 1 TO Q3: KDF = I * P2 ' I = HARMONIC,PI = 3.14...

1220 CTemp = S(T1, I) / KDF: S(T1, I) = -C(T1, I) / KDF: C(T1, I) = CTemp

1230 CTemp = -S(T1, Q - I) / KDF: S(T1, Q - I) = C(T1, Q - I) / KDF: C(T1, Q - I) = CTemp

1240 NEXT I

1241 KDF = Q2

1242 S(T1, Q2) = 0: C(T1, Q2) = 0' ZERO NYQUEST AND CONSTANT TERMS

1254 RETURN



